package cn.edu.cug.cs.gtl.docsrv.shp.service;

import cn.edu.cug.cs.gtl.docsrv.Managers;
import cn.edu.cug.cs.gtl.docsrv.dict.exception.BaseException;
import cn.edu.cug.cs.gtl.docsrv.shp.catalog.CatalogTree;
import cn.edu.cug.cs.gtl.docsrv.shp.querier.BlockQuerier;
import cn.edu.cug.cs.gtl.docsrv.shp.querier.GeometryQuerier;
import cn.edu.cug.cs.gtl.mybatis.mapper.shp.ShpAll;
import cn.edu.cug.cs.gtl.mybatis.mapper.shp.ShpCatalog;
import cn.edu.cug.cs.gtl.mybatis.mapper.shp.ShpItem;
import cn.edu.cug.cs.gtl.protos.Document;
import cn.edu.cug.cs.gtl.protos.DocumentList;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;

public interface ShpService {

    /**
     服务编号：7001
     服务名称：addShp
     功能描述：单个本地Shp文件入库
     接口描述： /api/shp/addShp
     传入参数：
     ShpAll  shp；前端传入ShpAll的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    void addShp(ShpAll shpAll);


    /**
     服务编号：7002
     服务名称：addShps
     功能描述：多个本地SHP文件入库
     接口描述： /api/shp/ addShps
     传入参数：
     List<ShpAll>  shps；前端传入ShpAll列表的JSON对象
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    void addShps(List<ShpAll> ls);

    /**
     服务编号：7003
     服务名称：addFromRawDB
     功能描述：从原始数据库中提取指定类型的图形文件入库
     接口描述： /api/shp/addFromRawDB
     传入参数：
     String shpType   图形类型，文件后缀；
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    boolean addFromRawDB();

    /**
     服务编号：7004
     服务名称：getShpByName
     功能描述：图形数据库中提取指定名称的图形文件
     接口描述： /api/shp/getShpByName
     传入参数：
     String shpName   图形名称；
     返回值：
     List<ShpAll> shpAllList 的JSON字符串
     调用示例：
     */
    List<ShpAll> getShpByName(String shpName);

    /**
     服务编号：7005
     服务名称：getShpByEnTitle
     功能描述：图形数据库中提取指定英文名称的图形文件
     接口描述： /api/shp/ getShpByEnTitle
     传入参数：
     String enTitle ；
     返回值：
     List<ShpAll> shpAllList 的JSON字符串
     调用示例：
     */
    List<ShpAll> getShpByEnTitle(String enTitle);


    /**
     服务编号：7006
     服务名称：getShpByCnTitle
     功能描述：图形数据库中提取指定中文名称的图形文件
     接口描述： /api/shp/ getShpByCnTitle
     传入参数：
     String cnTitle ；
     返回值：
     List<ShpAll> shpAllList 的JSON字符串
     调用示例：
     */
    List<ShpAll> getShpByCnTitle(String cnTitle);



    /**
     服务编号：7007
     服务名称：getShpByInternalId
     功能描述：图形数据库中提取指定ID的图形文件
     接口描述： /api/shp/getShpByInternalId
     传入参数：
     long internalId；
     返回值：
     ShpAll  shp     ; ShpAll的JSON字符串
     调用示例：
     */
    ShpAll getShpByInternalId(BigDecimal internalId);


    /**
     服务编号：7008
     服务名称：getShpByBoundingBox
     功能描述：图形数据库中提取指定范围的图形
     接口描述： /api/shp/getShpByBoundingBox
     传入参数：
     String bb；//minx,maxx,miny,maxy  数字之间逗号分隔
     String mask; //intersect 相交的图形； 或  contains 包含的图形
     返回值：
     List<ShpAll> shpAllList 的JSON字符串
     调用示例：
     */
    List<ShpAll> getShpByBoundingBox(String bb,  String mask);

    /**
     服务编号：7009
     服务名称：deleteShpByInternalId
     功能描述：删除图形数据库中指定ID的图形
     接口描述： /api/shp/deleteShpByInternalId
     传入参数：
     long internalId；
     返回值：
     成功返回true , 否则返回false
     调用示例：
     */
    boolean deleteShpByInternalId(BigDecimal internalId);


    /**
     服务编号：7010
     服务名称：getFeatureByBoundingBox
     功能描述：图形数据库中提取指定范围的要素
     接口描述： /api/shp/getFeatureByBoundingBox
     传入参数：
     String bb；//minx,maxx,miny,maxy  数字之间逗号分隔
     String mask; //intersect 相交的要素； 或  contains 包含的要素
     返回值：
     FeatureJSON的列表
     调用示例：
     */
    List<String> getFeatureByBoundingBox(String bb, String mask);




    /**
     服务编号：7011
     服务名称：getGeometryByBoundingBox
     功能描述：图形数据库中提取指定范围的几何对象
     接口描述： /api/shp/getGeometryByBoundingBox
     传入参数：
     String bb；//minx,maxx,miny,maxy  数字之间逗号分隔
     String mask; //intersect 相交的要素； 或  contains 包含的要素
     返回值：
     GeometryJSON的列表
     调用示例：
     */
    List<String> getGeometryByBoundingBox(String bb, String mask);

    /**
     * 服务编号：7012
     * 服务名称：getGeometriesByShpInternalId
     * 功能描述：图形数据库中提取指定Shp的几何对象
     * 接口描述： /api/shp/getGeometriesByShpInternalId
     * 传入参数：
     * long shpInternalId
     * 返回值：
     * GeometryJSON的列表
     * 调用示例：
     *
     * @param shpInternalId
     */
    List<String> getGeometriesByShpInternalId(BigDecimal shpInternalId);


    /**
     * 服务编号：7013
     * 服务名称：getEnvelopeByShpInternalId
     * 功能描述：图形数据库中提取指定范围的几何对象
     * 接口描述： /api/shp/getEnvelopeByShpInternalId
     * 传入参数：
     * long shpInternalId
     * 返回值：
     * Envelope
     * 调用示例：
     *
     * @param shpInternalId
     */
    Envelope getEnvelopeByShpInternalId(BigDecimal shpInternalId) ;



    /**
     * 服务编号：7014
     * 服务名称：getShpCatalogs
     * 功能描述：图形数据库中提取所有分类
     * 接口描述： /api/shp/getShpCatalogs
     * 传入参数：
     * 返回值：
     * List<ShpCatalog> catalogs
     * 调用示例：
     */
    List<ShpCatalog> getShpCatalogs();


    /**
     服务编号：7015
     服务名称：getGeometriesByShpInternalId
     功能描述：图形数据库中提取指定Shp的几何对象
     接口描述： /api/shp/getFeaturesByShpInternalId
     传入参数：
     long shpInternalId
     返回值：
     FeatureJSON的列表
     调用示例：
     */
    List<String> getFeaturesByShpInternalId( BigDecimal shpInternalId);
    /**
     服务编号：7016
     服务名称：getDocumentByShpInternalId
     功能描述：图形数据库中提取指定Shp文档
     接口描述： /api/shp/getDocumentByShpInternalId
     传入参数：
     long shpInternalId
     返回值：
     Document doc;
     其中，每个Feature的GeoJSON字符串为Document的一个content；
     其他的不为空的字段为该Shp文档的元数据。
     调用示例：
     http://localhost:8090/api/shp/getDocumentByShpInternalId?shpInternalId=3
     */
    Document getDocumentByShpInternalId(BigDecimal shpInternalId);

    /**
     服务编号：7023
     服务名称：getDocumentsByCatalogInternalId
     功能描述：图形数据库中提取指定分类ID的所有图形文档
     接口描述：/api/shp/getDocumentsByCatalogInternalId
     传入参数：
     BigDecimal catalogInternalId
     返回值：
     DocumentList docList;
     其中，每个Feature的GeoJSON字符串为Document的一个content；
     其他的不为空的字段为该Shp文档的元数据。
     调用示例：
     http://localhost:8090/api/shp/getDocumentsByCatalogInternalId?catalogInternalId=3
     */
    DocumentList getDocumentsByCatalogInternalId(BigDecimal catalogInternalId);

    /**
     * 将所有的目录整理成一个树后返回
     * @return
     */
    CatalogTree getCatalogTree();

    List<BigDecimal> getShpInternalIdsByCatalogInternalId(BigDecimal catalogId);


//    List<ShpItem> getShpData() throws Exception;
//
//    List<ShpAll> getShpDataAll() throws Exception;
//
//    List<ShpAll> queryShpData(ShpAll shpAll) throws Exception;
//
//
//    void addShpData(ShpAll shpAll) throws Exception;
//
//    void deleteShpData(ShpAll shpAll) throws Exception;
//
//    void updateShpData(ShpAll shpAll) throws Exception;
//
//    void downloadShpFile(BigDecimal shpInternalId, HttpServletResponse response) throws Exception;
}
